package com.itheima.tlais_web_management.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Slf4j
@Aspect
@Component
public class MyAspectthree {

    /**
     * 1、创建一个注解类：@Retention(RetentionPolicy.RUNTIME)：何时生效
     *                @Target(ElementType.METHOD)：给谁注解
     *
     * 2、将这个注解类的地址通过 @annotation 注到方法上 or 直接写到
     *
     * 3、所有注了 注解类 的方法运行时都会被匹配
     *
     * ---通过注解匹配切入点方法
     *
     */

    @Pointcut("@annotation(com.itheima.tlais_web_management.aop.Mylog)")
    public void pt(){}


    @Before("com.itheima.tlais_web_management.aop.MyAspectthree.pt()")
    public void before(JoinPoint joinPoint){

        //获取方法运行时的相关信息
        System.out.println("方法调用的实际参数数组：" + Arrays.toString(joinPoint.getArgs()));
        System.out.println("连接点类型：方法执行，字段获取：" + joinPoint.getKind());
        System.out.println("方法名、参数类型：" + joinPoint.getSignature().getName());
        System.out.println(joinPoint.getSourceLocation());
        System.out.println(joinPoint.getStaticPart());
        System.out.println("实际业务对象：" + joinPoint.getTarget().getClass().getName());
        System.out.println("代理对象本身：" + joinPoint.getThis().getClass().getName());

        log.info("before...");


    }

}
